package xadrez;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class Menu{
	JMenuBar menuBar;
	JMenu menu, subMenu;
	JMenuItem cVc, pVp, pVc, sair, testar, config, ajuda, exibirAj;
	JFrame frame;
	Jogo jogo;
	int distanciaX, distanciaY;
	int resolucao;
	GameCVC gameCVC;
	GamePVP gamePVP;
	GamePVC gamePVC;
        Teste teste;
        String modoJogo;
	

	public Menu() {
		resolucao = 640;
		gameCVC = null;
		gamePVP = null;
		gamePVC = null;
		jogo = new Jogo();
		criaMenu();
	}
	
		
	private class Resolucao implements ActionListener {
		int novaResolucao;
		public Resolucao(int novaResolucao) {
			this.novaResolucao = novaResolucao;
			
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			resolucao = novaResolucao;
			frame.setPreferredSize(new Dimension(resolucao + distanciaX, resolucao + distanciaY));
			jogo.setResolucao(resolucao);
			frame.pack();
		}
	}
	
	private class Novo implements ActionListener {
		public Novo () {
			
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			//jogo.finaliza();
                        JMenuItem b = (JMenuItem) e.getSource();
			frame.remove(jogo);
                        if(b == cVc){    
                        	finalizaJogoAnterior();
                            gameCVC = new GameCVC();
                            gameCVC.execute();
                        }
                        
                        if(b == pVp){
                            	finalizaJogoAnterior();
                            	gamePVP = new GamePVP();
                                gamePVP.execute();
                        }
                        
                        if (b == pVc) {
                            finalizaJogoAnterior();
                            	gamePVC = new GamePVC();
                                gamePVC.execute();
                        }
                        
                        if(b == testar) {
                            finalizaJogoAnterior();
                            teste = new Teste();
                            teste.execute();
                        }
                                                      
                        
			
                }
        }
	
	private class GameCVC extends SwingWorker <Jogo, Object>{
		@Override
		protected Jogo doInBackground() throws Exception {
			// TODO Auto-generated method stub
			jogo = null;
			jogo = new Jogo(resolucao);
			frame.add(jogo);
			frame.pack();
                        modoJogo = "CvC";
			jogo.iniciaCpuVsCpu();
			return jogo;
			
		}
		
		@Override
		protected void done() {
			// TODO Auto-generated method stub
			super.done();
		}			
		
	}
        
        private class GamePVP extends SwingWorker <Jogo, Object>{
		@Override
		protected Jogo doInBackground() throws Exception {
			// TODO Auto-generated method stub
			jogo = null;
			jogo = new Jogo(resolucao);
			frame.add(jogo);
			frame.pack();
                        modoJogo = "PvP";
			jogo.iniciaPlayVsPlay();
			return jogo;
			
		}
		
		@Override
		protected void done() {
			// TODO Auto-generated method stub
			super.done();
		}			
		
	}
        
        private class GamePVC extends SwingWorker <Jogo, Object>{
		@Override
		protected Jogo doInBackground() throws Exception {
			// TODO Auto-generated method stub
			jogo = null;
			jogo = new Jogo(resolucao);
			frame.add(jogo);
			frame.pack();
                        modoJogo = "PvC";
			jogo.iniciaPlayVsCpu();
			return jogo;
			
		}
		
		@Override
		protected void done() {
			// TODO Auto-generated method stub
			super.done();
		}			
		
	}
        
        private class Teste extends SwingWorker <Tabuleiro, Object>{
                
		@Override
		protected Tabuleiro doInBackground() throws Exception {
			// TODO Auto-generated method stub
                        GeradorDeTabuleiro gerador = null;
                        if (resolucao == 800) 
                            resolucao = 640;
                        if (resolucao == 640)
                            resolucao = 480;
                        gerador = new GeradorDeTabuleiro(resolucao);
			frame.remove(jogo);  
                        jogo = null;
                        frame.add(gerador);
                        frame.setPreferredSize(new Dimension(resolucao + distanciaX, resolucao + distanciaY + (resolucao/4)));
			frame.pack();
                        
                        
                        Tabuleiro tab = gerador.criaTabuleiro();
                        
			jogo = new Jogo(resolucao, tab);
                        frame.remove(gerador);
                        frame.add(jogo);
                        frame.setPreferredSize(new Dimension(resolucao + distanciaX, resolucao + distanciaY));
                        frame.pack();                        
                        
                        if (modoJogo.equals("PvP"))
                            jogo.iniciaPlayVsPlay();
                        if (modoJogo.equals("CvC"))
                            jogo.iniciaCpuVsCpu();
                        if (modoJogo.equals("PvC"))
                            jogo.iniciaPlayVsCpu();
                        
			return tab;
			
		}
		
		@Override
		protected void done() {
			// TODO Auto-generated method stub
			super.done();
            			
		
                }
        }

    private void finalizaJogoAnterior() {
    	if (gameCVC != null) {
    		gameCVC.cancel(true);
    	} 
    	if (gamePVP !=null) {
    		gamePVP.cancel(true);
    	}
    	if (gamePVC != null) {
    		gamePVC.cancel(true);
    	}     	
    }


	private void criaMenu() {

		menuBar = new JMenuBar();

		// Menu Jogo
		menu = new JMenu("Jogo");
		menu.setMnemonic(KeyEvent.VK_J);
		menuBar.add(menu);

		// botao novo jogo
		subMenu = new JMenu("Novo");
		subMenu.setMnemonic(KeyEvent.VK_N);
		menu.add(subMenu);

		pVp = new JMenuItem("Player vs Player");
		pVp.setMnemonic(KeyEvent.VK_0);
		pVp.addActionListener(new Novo());
		subMenu.add(pVp);
                
		pVc = new JMenuItem("Player vs CPU");
                pVc.addActionListener(new Novo());
		subMenu.add(pVc);
                
		cVc = new JMenuItem("CPU vs CPU");
                cVc.addActionListener(new Novo());
		subMenu.add(cVc);
                
                testar = new JMenuItem("Testar");
                testar.addActionListener(new Novo());
                menu.add(testar);

		// botao sair
		sair = new JMenuItem("Sair", KeyEvent.VK_S);
		sair.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});
		menu.add(sair);

		// Menu Configuracao
		menu = new JMenu("Configuração");
		menu.setMnemonic(KeyEvent.VK_C);
		menuBar.add(menu);

		subMenu = new JMenu("Resolução");
		subMenu.setMnemonic(KeyEvent.VK_R);
		menu.add(subMenu);

		config = new JMenuItem("800x800");
		config.addActionListener(new Resolucao(800));
		subMenu.add(config);
		config = new JMenuItem("640x640");
		config.addActionListener(new Resolucao(640));
		subMenu.add(config);
		config = new JMenuItem("480x480");
		config.addActionListener(new Resolucao(480));
		subMenu.add(config);

		// Menu Ajuda               
		menu = new JMenu("Ajuda");
		menu.setMnemonic(KeyEvent.VK_A);

		ajuda = new JMenuItem("Sobre", KeyEvent.VK_O);
                ajuda.addActionListener(new ActionListener() {
                @Override

                public void actionPerformed(ActionEvent e) {
          
                    JFrame telaSobre = new JFrame("Sobre");
                    telaSobre.setSize(300, 300);
                    telaSobre.setVisible(true);
                    telaSobre.setLayout(new FlowLayout());
                    
                    ImageIcon icon = new ImageIcon("imagens/logo.png");
                    JLabel label = new JLabel("Nome do jogo", icon, JLabel.CENTER);
                    telaSobre.add(label);

                    }

                });
		menu.add(ajuda);
                
                exibirAj = new JMenuItem("Exibir Ajuda", KeyEvent.VK_E);
                exibirAj.addActionListener(new ActionListener() {
                @Override

                public void actionPerformed(ActionEvent e) {
          
                    JFrame telaAjuda = new JFrame("Ajuda");
                    telaAjuda.setSize(300, 300);
                    telaAjuda.setVisible(true);
                    telaAjuda.setLayout(new FlowLayout());
                                        
                    JLabel label = new JLabel("Como jogar: ");
                    telaAjuda.add(label);

                    }

                });
		menu.add(exibirAj);

		menuBar.add(menu);		
	}

	public void criaJanela() {
		frame = new JFrame("Xadrez");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.setVisible(true);
//		frame.setIgnoreRepaint(true);
		
		distanciaX = frame.getInsets().right + frame.getInsets().left;
		distanciaY = frame.getInsets().top + frame.getInsets().bottom + 20;		
		frame.setPreferredSize(new Dimension(resolucao + distanciaX, resolucao + distanciaY));		

		frame.setJMenuBar(menuBar);		
		frame.add(jogo);		
		frame.pack();
		
                modoJogo = "PvP";
		jogo.iniciaPlayVsPlay();
                

	}
	
	
	

        }


